import json
from typing import Dict,Any,List

class ContextManager:
    """
    上下文管理器，负责维护和提供对话或任务的上下文信息
    """
    def __init__(self):
        """初始化上下文存储，使用列表维护多轮对话历史"""
        self.contexts : List[Dict[str, Any]] = []

    def add_context(sel,user_input:str,agent_response:str):
        """
        添加新的对话上下文
        :param user_input:
        :param agent_response:
        :return:
        """
        sel.contexts.append({
            "user_input":user_input,
            "agent_response":agent_response
        })

    def get_recent_context(self,n:int = 3) -> str:
        """
        获取最近的n轮对话上下文，义字符串形式返回
        :param n:
        :return:
        """
        recent_contexts = self.contexts[-n:]
        context_str = ""
        for ctx in recent_contexts:
            context_str += f"User: {ctx['user_input']} \nAgent {ctx['agent_response']}\n"
        return context_str.strip()


class ToolInterface:
    """
    工具接口，定义工具的调用方法和上下文注入机制
    """
    def __init__(self,context_manager:ContextManager):
        """
        初始化工具接口
        :param context:
        """
        self.context_manager = context_manager

    def call_tool(self,user_input:str):
        """
        调用工具，注入上下文，并返回结果
        :param user_input:
        :return:
        """
        context = self.context_manager.get_recent_context()
        full_input = f"Context {context}: \n User input:{user_input}"
        result = self._process_with_tool(full_input)
        self.context_manager.add_context(user_input,result)
        return result

    def _process_with_tool(self,input_data:str) -> str:
        return f"Processed input length: {len(input_data)}"

if __name__ == '__main__':
    context_manager = ContextManager()
    tool = ToolInterface(context_manager)

    user_inputs = [
        "你好，请告诉今天天气如何",
        "好的，那明天呢？",
        "谢谢，再见"
    ]
    for user_input in user_inputs:
        result = tool.call_tool(user_input)
        print(f"User:{user_input}")
        print(f"Agent:{result}")
        print("-" * 50)